package cn.ly.hex;

public class NumTypeToHex {
	
    final static char[] digits = {
            '0' , '1' , '2' , '3' , '4' , '5' ,
            '6' , '7' , '8' , '9' , 'a' , 'b' ,
            'c' , 'd' , 'e'
            };
    
	public static void main(String[] args) {
		byte b = 127;
		b += 1;
		System.out.println(b);
		System.out.println(toBinaryString(-3));//这个计算结果是补码，java里计算出来的二进制，都是补码
		
		float f = 1;
		double d = 2;
		long l = 3;
		f = f + l;
		
	}
	
	public static String toBinaryString(int value){
		return toUnsignedString(value, 1);
	}
	
	public static String to8String(int value){
		return toUnsignedString(value, 3);
	}

	public static String toHexString(int value){
		return toUnsignedString(value, 4);
	}
	
	
    private static String toUnsignedString(int i, int shift) {
        char[] buf = new char[32];
        int charPos = 32;
        int radix = 1 << shift;                     // 1 << 2=>2进制 ,  1 << 3=>8进制  1 << 4=>16进制
        int mask = radix - 1;                       //2-1=1 取(0～1之间的数)  8-1=7 取(0～7之间的数) 16-1=15 取(0～15之间的数)
        do {
            buf[--charPos] = digits[i & mask];     //i&(2-1)(0～1之间的数)  i&7 取(0～7之间的数) i&15 取(0～15之间的数),然后再用数组倒着排入数组中
            i >>>= shift;                          //-3 >>> 1==>2147483646,所以这个数与1 、7 、15做逻辑与运算后，刚好得到补码
        } while (i != 0);

        return new String(buf, charPos, (32 - charPos));
    }

}
